package com.roc.admin.infrastructure.config;

import cn.dev33.satoken.stp.StpInterface;
import com.roc.admin.domain.repository.UserRepository;
import com.roc.admin.domain.valueobject.UserPermission;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 自定义权限验证接口扩展
 */
@Component
@AllArgsConstructor
public class StpInterfaceImpl implements StpInterface {

    private final UserRepository userRepository;


    /**
     * 返回指定账号id所拥有的权限码集合
     *
     * @param loginId   账号id
     * @param loginType 账号类型
     * @return 权限码集合
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        // 获取用户ID
        Long userId = Long.parseLong(loginId.toString());
        
        // 调用领域服务获取用户权限
        Set<UserPermission> permissions = userRepository.findById(userId)
                .map(user -> user.getPermissions())
                .orElse(Set.of());
        
        // 将权限对象转换为权限编码列表
        return permissions.stream()
                .map(UserPermission::getCode)
                .collect(Collectors.toList());
    }

    /**
     * 返回指定账号id所拥有的角色标识集合
     *
     * @param loginId   账号id
     * @param loginType 账号类型
     * @return 角色标识集合
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        // 获取用户ID
        Long userId = Long.parseLong(loginId.toString());
        
        // 调用领域服务获取用户角色
        return userRepository.findById(userId)
                .map(user -> user.getRoles().stream()
                        .map(role -> role.getCode())
                        .collect(Collectors.toList()))
                .orElse(new ArrayList<>());
    }
}
